package br.com.ac.fatureweb.integration.model;

/**
 * <p>
 * Classe que serve para transportar o código de barras completo.
 * </p>
 *
 * <p>
 * Esta classe contém os dados do código de barras separado pelos 4 blocos.
 * </p>
 *
 * <p>
 * Gerar Código de Barra.
 * </p>
 *
 * <p>
 * - O código de barras é do tipo 2 de 5 intercalado, ou seja, 2 de 5 significa
 * que 5 barras definem 1 caracter sendo que duas delas são barras largas.
 * Intercalado significa que o espaço entre as barras também tem significado.<br/>
 * - O tamanho total do campo do código de barras é de 48 posições com os
 * dígitos verificadores, sendo 44 para conteúdo dos dados, mais quatro
 * destinados ao dígito verificador. - O código de barras será composto por 4
 * blocos de 11 posições acrescidos de 1 dígito verificador para cada bloco. Os
 * dígitos verificadores não estarão representados na string do código de barras
 * e serão calculados de acordo com o módulo 10.
 *
 * Exemplo de blocos da string numérica do código de barras com dígito
 * verificador: Bloco1:|8|2|6|5|0|0|0|0|0|3|3|DV1:4,
 * Bloco2:|1|2|2|0|0|0|0|9|0|0|3|DV2:7 Bloco3:|3|0|6|8|0|0|1|2|0|0|8|DV3:2,
 * Bloco4:|0|0|0|0|0|0|0|0|0|0|1|DV4:8<br/>
 *
 * 826500000334122000090037306800120082000000000018
 * </p>
 *
 * <p>
 * Exemplo de string alfa de 110 caracteres concatenada:
 * wNnwNNwWnnnnWWnnnWWnNNwwnWwnnNnWnnWnnWWnnnWWnnwNWnNNwwnwwNNnNwwNnnnWWnwNnnWnnWWnwnNWnnnWWnnnWWnnnWWnnnWWnNnwwN
 * </p>
 *
 */
public class CodeBar {

	/**
	 * Representa o 1 bloco do código de barras.
	 */
	private String codigoBarra1;

	/**
	 * Representa o dígito verificador do 1 bloco do código de barras.
	 */
	private Character digitoCodigoBarra1;

	/**
	 * Representa o 2 bloco do código de barras.
	 */
	private String codigoBarra2;

	/**
	 * Representa o dígito verificador do 2 bloco do código de barras.
	 */
	private Character digitoCodigoBarra2;

	/**
	 * Representa o 3 bloco do código de barras.
	 */
	private String codigoBarra3;

	/**
	 * Representa o dígito verificador do 3 bloco do código de barras.
	 */
	private Character digitoCodigoBarra3;

	/**
	 * Representa o 4 bloco do código de barras.
	 */
	private String codigoBarra4;

	/**
	 * Representa o dígito verificador do 4 bloco do código de barras.
	 */
	private Character digitoCodigoBarra4;

	/**
	 * Representa a String Alfa Numérica do código de barras.
	 */
	private String codigoBarra;

	/**
	 * Representa o 1 bloco do código de barras.
	 *
	 * @return the dscCodigoBarra1
	 */
	public String getDscCodigoBarra1() {
		return codigoBarra1;
	}

	/**
	 * Representa o 1 bloco do código de barras.
	 *
	 * @param dscCodigoBarra1
	 *            the dscCodigoBarra1 to set
	 */
	public void setDscCodigoBarra1(final String dscCodigoBarra1) {
		this.codigoBarra1 = dscCodigoBarra1;
	}

	/**
	 * Representa o dígito verificador do 1 bloco do código de barras.
	 *
	 * @return the numDigitoCodigoBarra1
	 */
	public Character getNumDigitoCodigoBarra1() {
		return digitoCodigoBarra1;
	}

	/**
	 * Representa o dígito verificador do 1 bloco do código de barras.
	 *
	 * @param numDigitoCodigoBarra1
	 *            the numDigitoCodigoBarra1 to set
	 */
	public void setNumDigitoCodigoBarra1(final Character numDigitoCodigoBarra1) {
		this.digitoCodigoBarra1 = numDigitoCodigoBarra1;
	}

	/**
	 * Representa o 2 bloco do código de barras.
	 *
	 * @return the dscCodigoBarra2
	 */
	public String getDscCodigoBarra2() {
		return codigoBarra2;
	}

	/**
	 * Representa o 2 bloco do código de barras.
	 *
	 * @author F. Assis V. M. Júnior[assisprog@gmail.com] $22/06/2008 -
	 *         10:27:53$.
	 * @since modelo - 2008.
	 * @param dscCodigoBarra2
	 *            the dscCodigoBarra2 to set
	 */
	public void setDscCodigoBarra2(final String dscCodigoBarra2) {
		this.codigoBarra2 = dscCodigoBarra2;
	}

	/**
	 * Representa o dígito verificador do 2 bloco do código de barras.
	 *
	 * @return the numDigitoCodigoBarra2
	 */
	public Character getNumDigitoCodigoBarra2() {
		return digitoCodigoBarra2;
	}

	/**
	 * Representa o dígito verificador do 2 bloco do código de barras.
	 *
	 * @param numDigitoCodigoBarra2
	 *            the numDigitoCodigoBarra2 to set
	 */
	public void setNumDigitoCodigoBarra2(final Character numDigitoCodigoBarra2) {
		this.digitoCodigoBarra2 = numDigitoCodigoBarra2;
	}

	/**
	 * Representa o 3 bloco do código de barras.
	 *
	 * @return the dscCodigoBarra3
	 */
	public String getDscCodigoBarra3() {
		return codigoBarra3;
	}

	/**
	 * Representa o 3 bloco do código de barras.
	 *
	 * @param dscCodigoBarra3
	 *            the dscCodigoBarra3 to set
	 */
	public void setDscCodigoBarra3(final String dscCodigoBarra3) {
		this.codigoBarra3 = dscCodigoBarra3;
	}

	/**
	 * Representa o dígito verificador do 3 bloco do código de barras.
	 *
	 * @return the numDigitoCodigoBarra3
	 */
	public Character getNumDigitoCodigoBarra3() {
		return digitoCodigoBarra3;
	}

	/**
	 * Representa o dígito verificador do 3 bloco do código de barras.
	 *
	 * @param numDigitoCodigoBarra3
	 *            the numDigitoCodigoBarra3 to set
	 */
	public void setNumDigitoCodigoBarra3(final Character numDigitoCodigoBarra3) {
		this.digitoCodigoBarra3 = numDigitoCodigoBarra3;
	}

	/**
	 * Representa o 4 bloco do código de barras.
	 *
	 * @return the dscCodigoBarra4
	 */
	public String getDscCodigoBarra4() {
		return codigoBarra4;
	}

	/**
	 * Representa o 4 bloco do código de barras.
	 *
	 * @param dscCodigoBarra4
	 *            the dscCodigoBarra4 to set
	 */
	public void setDscCodigoBarra4(final String dscCodigoBarra4) {
		this.codigoBarra4 = dscCodigoBarra4;
	}

	/**
	 * Representa o dígito verificador do 4 bloco do código de barras.
	 *
	 * @return the numDigitoCodigoBarra4
	 */
	public Character getNumDigitoCodigoBarra4() {
		return digitoCodigoBarra4;
	}

	/**
	 * Representa o dígito verificador do 4 bloco do código de barras.
	 *
	 * @param numDigitoCodigoBarra4
	 *            the numDigitoCodigoBarra4 to set
	 */
	public void setNumDigitoCodigoBarra4(final Character numDigitoCodigoBarra4) {
		this.digitoCodigoBarra4 = numDigitoCodigoBarra4;
	}

	/**
	 * Representa a String Alfa Numérica do código de barras.
	 *
	 * @return the alfaCodigoBarra
	 */
	public String getAlfaCodigoBarra() {
		return codigoBarra;
	}

	/**
	 * Representa a String Alfa Numérica do código de barras.
	 *
	 * @param alfaCodigoBarra
	 *            the alfaCodigoBarra to set
	 */
	public void setAlfaCodigoBarra(final String alfaCodigoBarra) {
		this.codigoBarra = alfaCodigoBarra;
	}

	/**
	 * Obtém o código de barras formado sem os dígitos verificadores.
	 *
	 * @return O código de barras sem os dígitos verificadores.
	 */
	public String getCodigoBarra() {
		final StringBuilder resposta = new StringBuilder();

		resposta.append(codigoBarra1);
		resposta.append(codigoBarra2);
		resposta.append(codigoBarra3);
		resposta.append(codigoBarra4);

		if (resposta.toString().length() == 0) {
			return null;
		}

		return resposta.toString();
	}

	@Override
	public String toString() {
		return "CodeBar [codigoBarra1=" + codigoBarra1
				+ ", digitoCodigoBarra1=" + digitoCodigoBarra1
				+ ", codigoBarra2=" + codigoBarra2 + ", digitoCodigoBarra2="
				+ digitoCodigoBarra2 + ", codigoBarra3=" + codigoBarra3
				+ ", digitoCodigoBarra3=" + digitoCodigoBarra3
				+ ", codigoBarra4=" + codigoBarra4 + ", digitoCodigoBarra4="
				+ digitoCodigoBarra4 + ", codigoBarra=" + codigoBarra + "]";
	}

}